[IA64] declaration of metaphysical_rr
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Fri, 17 Feb 2006 21:42:02 +0000 (14:42 -0700)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Fri, 17 Feb 2006 21:42:02 +0000 (14:42 -0700)
I'm making a patch for domain destruction.
While I tested my patch by repeatedly
creating/destructing domains,
a reserved register/field fault occurred in load_region_regs().

The cause of this fault is rr0 value overflow(0xFFFFFFFF********)
because metaphysical_rr0 in the arch_domain struct is
declared as integer (should be unsigned long).
The attached patch fixes the problem.

Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
xen/arch/ia64/xen/hyperprivop.S
xen/include/asm-ia64/domain.h

index 0f6c37b4339e56f565eb460b5a8affacea39cedd..7aa1eadc78d5fc7359f6e7e95ebac261098bd43b 100644 (file)
@@ -1336,7 +1336,7 @@ ENTRY(hyper_ssm_dt)
        movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
        ld8 r22=[r22];;
        adds r22=IA64_VCPU_META_SAVED_RR0_OFFSET,r22;;
-       ld4 r23=[r22];;
+       ld8 r23=[r22];;
        mov rr[r0]=r23;;
        srlz.i;;
        st4 [r20]=r0 ;;
@@ -1372,7 +1372,7 @@ ENTRY(hyper_rsm_dt)
        movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
        ld8 r22=[r22];;
        adds r22=IA64_VCPU_META_RR0_OFFSET,r22;;
-       ld4 r23=[r22];;
+       ld8 r23=[r22];;
        mov rr[r0]=r23;;
        srlz.i;;
        adds r21=1,r0 ;;
@@ -1733,7 +1733,7 @@ ENTRY(hyper_set_rr)
        dep r23=r28,r23,16,8;;
        dep r23=r29,r23,8,8
        cmp.eq p6,p0=r25,r0;;   // if rr0, save for metaphysical
-(p6)   st4 [r24]=r23
+(p6)   st8 [r24]=r23
        mov rr[r8]=r23;;
        // done, mosey on back
 1:     mov r24=cr.ipsr
index a812ac5576cf0b20ea89223bf280097c0a2238d3..36318027d19f9236d929ee8aa71904f9ae84c8db 100644 (file)
@@ -15,8 +15,8 @@ extern void domain_relinquish_resources(struct domain *);
 struct arch_domain {
     struct mm_struct *active_mm;
     struct mm_struct *mm;
-    int metaphysical_rr0;
-    int metaphysical_rr4;
+    unsigned long metaphysical_rr0;
+    unsigned long metaphysical_rr4;
     int starting_rid;          /* first RID assigned to domain */
     int ending_rid;            /* one beyond highest RID assigned to domain */
     int rid_bits;              /* number of virtual rid bits (default: 18) */
@@ -61,10 +61,10 @@ struct arch_vcpu {
        unsigned long xen_timer_interval;
 #endif
     mapped_regs_t *privregs; /* save the state of vcpu */
-    int metaphysical_rr0;              // from arch_domain (so is pinned)
-    int metaphysical_rr4;              // from arch_domain (so is pinned)
-    int metaphysical_saved_rr0;                // from arch_domain (so is pinned)
-    int metaphysical_saved_rr4;                // from arch_domain (so is pinned)
+    unsigned long metaphysical_rr0;            // from arch_domain (so is pinned)
+    unsigned long metaphysical_rr4;            // from arch_domain (so is pinned)
+    unsigned long metaphysical_saved_rr0;      // from arch_domain (so is pinned)
+    unsigned long metaphysical_saved_rr4;      // from arch_domain (so is pinned)
     int breakimm;                      // from arch_domain (so is pinned)
     int starting_rid;          /* first RID assigned to domain */
     int ending_rid;            /* one beyond highest RID assigned to domain */